home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 1992-11-08 | 6.8 KB | 246 lines |
- Set Buffer 20
- Close Editor : Close Workbench
- Unpack 6 To 0 : Screen Hide 0
- For Y=0 To 11
- For X=0 To 19
- Get Block X+Y*20+1,X*16,Y*16,16,16,0
- Next
- Next
- 'For A=0 To 103
- ' Get Sprite A+1,(A mod 20)*16,(A/20)*16+192 To(A mod 20)*16+16,(A/20)*16+208
- 'Next
- Screen Open 1,480,480,32,0
- Curs Off : Flash Off : Cls 0 : Get Palette 0
- Screen Display 1,128,50,320,192
- Screen Close 0
- Dim F(29,29,1),AN(23,5),PAT(49,1)
- Hide
- LE=1
- Gosub LADEN
- Gosub ZEIGEN
- OX=0 : OY=0 : X=16*AMX : Y=16*AMY : XX=AMX : YY=AMY : LE=1 : A=0
- HA=0 : PAT=0
- Do
- If(X mod 16)=0 and(Y mod 16)=0
- RX=(Jleft(1)-Jright(1))*2 : RY=(Jup(1)-Jdown(1))*2
- If RY<0 : DIA=0 : RX=0 : End If
- If RX>0 : DIA=2 : RY=0 : End If
- If RY>0 : DIA=4 : RX=0 : End If
- If RX<0 : DIA=6 : RY=0 : End If
- F=F(XX+Sgn(RX),YY+Sgn(RY),0)
- If F and 1
- RX=0 : RY=0
- Else
- PAT(PAT,0)=X/16 : PAT(PAT,1)=Y/16 : Add PAT,1,0 To 49
- End If
- End If
- Add DI,Sgn(DIA-DI)
- Add X,RX : Add Y,RY : XX=(X+8)/16 : YY=(Y+8)/16
- If APPS=0 and XX=HMX and YY=HMX Then End
- If XX<>OLX or YY<>OLY Then OLX=XX : OLY=YY : Gosub NEWBLOCK
- OX=Max(160,Min(320,X))-160 : OY=Max(80,Min(368,Y))-80
- If BL=0 and Rnd(100)=1 Then MX=Rnd(29) : MY=Rnd(29) : If F(MX,MY,1)<8 Then BL=1 : RI=1
- If BL Then Gosub FLAP
- Gosub ANI
- Add HA,1,0 To 7
- If TIM>0 Then Dec TIM : SHI=1-SHI Else SHI=0
- Wait Vbl : Sprite 0,X-OX+128,Y-OY+50,DI+2+SHI*8 : Screen Offset 1,OX,OY
- Sprite 2,HMX*16-OX+128,HMY*16-OY+50,29+HA/2
- Loop
- End
- ANI:
- For A=4 To AN
- If AN(A,2)=0 or AN(A,2)=1 Then AN(A,2)=1-AN(A,2)
- If AN(A,2)=3 Then AN(A,2)=2 Else If AN(A,2)=2 Then AN(A,2)=3
- If AN(A,2)>3 Then Add AN(A,2),1,4 To 6
- Bob A+1,AN(A,0),AN(A,1),AN(A,2)+97
- Next
- For A=0 To 3
- If AN(A,2) Then Gosub BOANI2
- Next
- Return
- BOANI2:
- Gosub COMP
- If(AN(A,0) mod 16)=0 and(AN(A,1) mod 16)=0
- Gosub PATH
- End If
- Add AN(A,0),RXX : Add AN(A,1),RYY
- Add AN(A,4),Sgn(AN(A,3)-AN(A,4))
- Bob A+1,AN(A,0),AN(A,1),AN(A,2)+25+AN(A,4)
- Return
- PATH:
- D=PAT
- For B=0 To 49
- If AN(A,0)/16=PAT(D,0) and AN(A,1)/16=PAT(D,1)
- RXX=PAT(D,0) : RYY=PAT(D,1) : Add D,-1,0 To 49
- RXX=Sgn(PAT(D,0)-RXX)*S : RYY=Sgn(PAT(D,1)-RYY)*S
- Home : Print RXX,RYY
- Exit
- End If
- Add D,-1,0 To 49
- Next
- If B=50 Then Gosub SIMPLE : Return
- Gosub CONV
- Return
- ALGORYTHM:
- RXXA=RXX : RYYA=RYY
- C=0 : D=20000
- Repeat
- AN(A,3)=Rnd(3)*2
- Gosub COMP
- D2=Abs((AN(A,0)+Sgn(RXX)*16)-X)+Abs((AN(A,1)+Sgn(RYY)*16)-Y)
- F=F(AN(A,0)/16+Sgn(RXX),AN(A,1)/16+Sgn(RYY),0)
- If D>D2 and(F and 1)=0 Then D=D2 : RXXA=RXX : RYYA=RYY Else Inc C
- Until(F and 1)=0 and C>3
- RXX=RXXA : RYY=RYYA : Gosub CONV
- Return
- SIMPLE:
- If(F(AN(A,0)/16+Sgn(RXX),AN(A,1)/16+Sgn(RYY),0) and 1) or Rnd(10)=0
- RXXA=-RXX : RYYA=-RYY
- C=0
- Repeat
- AN(A,3)=Rnd(3)*2
- Gosub COMP
- F=F(AN(A,0)/16+Sgn(RXX),AN(A,1)/16+Sgn(RYY),0)
- Inc C
- Until(F and 1)=0 and((RXX<>RXXA and RYY<>RYYA) or C>9)
- End If
- Return
- COMP:
- B=AN(A,5) and 3 : S=1
- If B=1 Then S=2
- If B=2 Then S=4
- If B=3 Then S=8
- If AN(A,3)=0 Then RYY=-S : RXX=0
- If AN(A,3)=4 Then RYY=S : RXX=0
- If AN(A,3)=6 Then RXX=-S : RYY=0
- If AN(A,3)=2 Then RXX=S : RYY=0
- Return
- CONV:
- If RYY<0 Then AN(A,3)=0
- If RXX>0 Then AN(A,3)=2
- If RYY>0 Then AN(A,3)=4
- If RXX<0 Then AN(A,3)=6
- Return
- FLAP:
- Put Block 163+BL*7+(F(MX,MY,1)-1) mod 7,MX*16,MY*16
- Add BL,RI
- If BL=7 Then RI=-1
- If BL=0 Then F(MX,MY,1)=(F(MX,MY,1)-1 mod 7)+1+(12+Rnd(8))*7 : Put Block 1+F(MX,MY,1),MX*16,MY*16
- Return
- NEWBLOCK:
- F=(F(XX,YY,1)-1)/7 : SH=(F(XX,YY,1)-1) mod 7 : D=0
- If F=1 Then D=1 : Inc SC : Dec APPS
- If F=2 Then F(XX,YY,1)=SH+8 : Put Block SH+9,XX*16,YY*16 : Add SC,2
- If F=13 Then Add F(XX,YY,1),(1+Rnd(8))*7 : Put Block F(XX,YY,1)+1,XX*16,YY*16 : Add SC,50
- If F>13 and F<22 Then D=1 : Add SC,(F-11)*25
- If F=22 Then D=1 : Add TIM,200 : SHI=0
- If D Then F(XX,YY,1)=SH+1 : Put Block SH+2,XX*16,YY*16
- FA=(F(XX,YY,0) and 6) : NR=(F(XX,YY,0) and 248)/8
- If FA=2 Then Gosub TELEPORT : Return
- If FA=4 Then Gosub SWITCH : Return
- If FA=6 Then Gosub SECRET
- Return
- SECRET:
- Colour 0,$F00
- Return
- SWITCH:
- AD=ST+100+NR*20
- For A=0 To 4
- AAX=Peek(AD+A*4) : AAY=Peek(AD+A*4+1)
- If AAX>0 and AAY>0
- AA=F(AAX,AAY,1) : If(AA-1)/7=1 or(AA-1)/7=2 : Dec APPS : End If
- F(AAX,AAY,0)=Peek(AD+A*4+2)
- F(AAX,AAY,1)=Peek(AD+A*4+3)
- AX=AAX : AY=AAY : Gosub MAKESHADOW
- If F(AAX,AAY,1)>219 or AA>219
- AX=AAX+1 : AY=AAY : Gosub MAKESHADOW
- AX=AAX : AY=AAY+1 : Gosub MAKESHADOW
- AX=AAX+1 : AY=AAY+1 : Gosub MAKESHADOW
- End If
- AA=(F(AAX,AAY,1)-1)/7 : If AA=1 or AA=2 : Inc APPS : End If
- End If
- Next
- Return
- TELEPORT:
- AX=Peek(ST+40+NR*2)*16 : AY=Peek(ST+41+NR*2)*16
- A=0
- Repeat
- For B=1 To 31
- Colour B,$FFF-Colour(B)
- Next
- If Abs(AX-X)>9 Then Add X,(AX-X)/10 Else Add X,Sgn(AX-X)
- If Abs(AY-Y)>9 Then Add Y,(AY-Y)/10 Else Add Y,Sgn(AY-Y)
- OX=Max(160,Min(320,X))-160 : OY=Max(80,Min(368,Y))-80
- Wait Vbl : Sprite 0,X-OX+128,Y-OY+50,DI+2 : Screen Offset 1,OX,OY
- Add HA,1,0 To 7
- Sprite 2,HMX*16-OX+128,HMY*16-OY+50,29+HA/2
- Add DI,1,0 To 7
- A=1-A
- Until X=AX and Y=AY
- If A
- For B=1 To 31
- Colour B,$FFF-Colour(B)
- Next
- End If
- Return
- MAKESHADOW:
- If F(AX,AY,1)>219 Then Put Block F(AX,AY,1)+1,AX*16,AY*16 : Return
- SH=0
- If AX<1 Then Goto SKIP1
- F=F(AX-1,AY,1) : If F=220 or F=223 or F=225 or F=227 or F=233 Then SH=1
- If F=225 or F=231 or F=232 or F=235 Then SH=5
- SKIP1:
- If AY<1 Then Goto SKIP2
- F=F(AX,AY-1,1) : If F=221 or F=223 or F=228 or F=235 Then SH=2
- If F=222 or F=231 or F=233 or F=234 Then SH=6
- SKIP2:
- If AX<1 or AY<1 Then Goto SKIP3
- F=F(AX-1,AY-1,1) : If F=224 or F=226 or F=229 or F=230 Then SH=3
- If F=223 or F=231 or F=233 or F=235 Then SH=4
- SKIP3:
- F(AX,AY,1)=((F(AX,AY,1)-1)/7)*7+SH+1
- Put Block F(AX,AY,1)+1,AX*16,AY*16
- Return
- LADEN:
- Erase 7 : Reserve As Work 7,2200
- Bload "Levels/"+Str$(LE)-" ",Start(7)
- ST=Start(7)
- AMX=Peek(ST) : AMY=Peek(ST+1) : DI=Deek(ST+2)*2 : TIME=Deek(ST+6)
- HMX=Peek(ST+22) : HMY=Peek(ST+23) : APPS=Deek(ST+4)
- SECR=Deek(ST+8)
- NAME$=""
- For A=10 To 21 : NAME$=NAME$+Chr$(Peek(ST+A)) : Next
- AN=3
- For YY=0 To 29
- For XX=0 To 29
- F(XX,YY,0)=Peek(ST+400+YY*60+XX*2)
- F(XX,YY,1)=Peek(ST+401+YY*60+XX*2)
- If F(XX,YY,1)>71 and F(XX,YY,1)<87
- F=(F(XX,YY,1)-1)/7 : Inc AN
- AN(AN,0)=XX*16 : AN(AN,1)=YY*16
- AN(AN,2)=(F-11)*2
- End If
- Next
- Next
- For A=0 To 3
- AN(A,0)=Peek(ST+24+A*4)*16
- AN(A,1)=Peek(ST+25+A*4)*16
- AN(A,2)=Peek(ST+26+A*4)*8
- AN(A,3)=0
- AN(A,5)=Peek(ST+27+A*4)
- Next
- Return
- ZEIGEN:
- For YY=0 To 29
- For XX=0 To 29
- Put Block F(XX,YY,1)+1,XX*16,YY*16
- Next
- Next
- For A=0 To 3
- If AN(A,2) Then Bob A+1,AN(A,0),AN(A,1),AN(A,2)+25
- Next
- For A=4 To AN
- Bob A+1,AN(A,0),AN(A,1),AN(A,2)+97
- Next
- Return